home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / DELPHI32 / BUTTONS / MOVBUT10 / MOVBUT.PAS < prev    next >
Pascal/Delphi Source File  |  1996-10-29  |  8KB  |  183 lines

  1. unit Movbut;
  2. {
  3.   Moving Button Component
  4.   John Baumbach                         Delphi 1.0
  5.   email: mantis@vcnet.com               Copyright (c) 7-17-96
  6.   http://www.vcnet.com/mantis              by John Baumbach
  7.  
  8.   This component is 100% free and you are free to use it any
  9.   way you wish.  If you have a use for this component, all I
  10.   ask is that you e-mail me at the above address and let me 
  11.   know.  Thanks!
  12.  
  13.   Installation Instructions:
  14.   To check out a sample application without installing
  15.   the component, load the project file "movingbt.dpr" with
  16.   the Delphi editor and run.  If you have an error like
  17.   "Can't execute a DLL", make sure the sample form is loaded
  18.   by "View | Forms | ButtonObject", then clicking "OK".
  19.  
  20.   If you have an error like "Invalid File Name" during compile time
  21.   change your "Options | Project | Directories-Conditionals |
  22.   Output Directory" to the name of the directory which has the
  23.   unzipped files (if Delphi is set up to produce an output file).
  24.  
  25.   Installing Component to Toolbar:
  26.   This component is currently set up to be added to the "Samples"
  27.   palette of the toolbar.  If you wish to add it to a different
  28.   one, change the word "Samples" to the name of the desired
  29.   palette in the "Register" procedure below.
  30.  
  31.   Select "Options | Install Components" and select "Add", then
  32.   "movbut.pas" from the directory where you unzipped this file.
  33.   Delphi will then recompile the toolbar and the "TMovingButton"
  34.   component will be added to the palette!
  35.  
  36.   If you want to keep this component permanently, copy the "movebut.pas"
  37.   and "movebut.dcr" files to the "Delphi\LIB" subdirectory and follow the
  38.   above installation step.
  39.  
  40.   You can remove the component at any time the same way, except choose
  41.   "Options | Install Components" and choose "Movbut" to remove.
  42.  
  43.   Using the MovingButton:
  44.   Once installed in toolbar, you can use it just like the "TBitBtn"
  45.   component.  The button is designed to move around inside the parent
  46.   rectangle, whether it's the entire form or a container such as a panel.
  47.   The sample application uses three panels to house the three buttons, with
  48.   no bevel so the panels are invisible.
  49.  
  50.   The new properties are "PixelsPerMove", "MoveInterval" and
  51.   "IsMoving".  PixelsPerMove is how many pixels the button will move each
  52.   time it moves, MoveInterval is how many milliseconds between moves, and
  53.   IsMoving is whether or not the button is currently moving.
  54.  
  55.   Performance:
  56.   On a 486-100 with 16 megs under Win95 and the default of
  57.   100 milliseconds for "MoveInterval", the system is able to handle
  58.   a maximum of the following number of buttons before bogging down
  59.   (during run time)
  60.  
  61.             TBitBtn Ancestor:
  62.                        No Glyphs:      9 buttons
  63.                       With Glyph:      8 buttons
  64.  
  65.   During design time, they will bog down sooner.  Setting the timer
  66.   to a longer delay will allow more buttons to be added without bogging.
  67.  
  68.   Changing the ancestor to "TButton" doesn't affect performance.
  69.  
  70.   Enhancements:
  71.   Currently, the buttons will take up system CPU cycles even
  72.   when "IsMoving" is set to false.  Once the parent of the button is destroyed
  73.   all the resources are freed, so this shouldn't be too much of a problem.
  74.  
  75.   Also, dragging buttons around (while they're moving) during design
  76.   time leaves tracers on the screen.  This is harmless but annoying.
  77.   To remedy, I would set "IsMoving" to false during design time.
  78.  
  79.   I plan to add: animation to the glyphs, scrolling text, and growing and
  80.   shrinking button sizes.  I just need to find the time.
  81.  
  82.   If you want to edit the bitmap that appears on the palette, the image
  83.   is located in the "movebut.dcr" file.  Use the Delphi Image Editor to
  84.   edit the bitmap and save it back to this resource file.  Don't change
  85.   the name of the bitmap in the resource file or it won't be added to
  86.   the palette.
  87. }
  88.  
  89. interface
  90.  
  91. uses
  92.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  93.   Forms, Dialogs, StdCtrls, ExtCtrls, Buttons;
  94.  
  95. type
  96.    TMovingButton = class(TBitBtn)
  97.    procedure ButtonTimerTimer(Sender: TObject);   { added procedure }
  98.    private
  99.       xdir, ydir: integer;            { variables in procedure }
  100.       speed, minterval: integer;
  101.       ButtonTimer: TTimer;
  102.       buttonmoving: boolean;
  103.    public
  104.       constructor Create(AOwner: TComponent); override;
  105.    published
  106.       { additional properties to go onto object inspector panel }
  107.       property MoveInterval: integer read minterval
  108.          write minterval default 100;
  109.       property PixelsPerMove: integer read speed
  110.          write speed default 1;
  111.       property IsMoving: boolean read buttonmoving
  112.          write buttonmoving;
  113. end;  { of type }
  114.  
  115. procedure Register;
  116.  
  117. implementation
  118.  
  119. procedure Register;         { registers with toolbar when being installed }
  120. begin
  121.     RegisterComponents('Samples', [TMovingButton]);
  122. end;
  123.  
  124. constructor TMovingButton.Create(AOwner: TComponent);
  125. begin                                 { procedure to create button type and }
  126.     inherited Create(AOwner);         { set default behavior                }
  127.                                       { "Inherited" means it gets all the   }
  128.                                       { properties of TBitBtn               }
  129.     minterval:=100;                   { time in milliseconds between moves }
  130.     speed:=1;                         { pixels per move }
  131.     xdir:=speed;
  132.     ydir:=speed;
  133.     width:=127;                       { button width }
  134.     spacing:=10;                      { glyph spacing }
  135.     font.color:=clBtnText;            { Delphi uses "clWindowText" by default, which   }
  136.                                       { is odd...                                      }
  137.     ButtonTimer:=TTimer.Create(Self);      { create the timer }
  138.     with ButtonTimer do begin
  139.         Enabled:=true;                      { turn timer on }
  140.         interval:=minterval;                { set interval  }
  141.         OnTimer:=ButtonTimerTimer;          { point to movment procedure }
  142.     end;
  143.     buttonmoving:=true;                     { set button in motion }
  144. end;
  145.  
  146. procedure TMovingButton.ButtonTimerTimer(Sender: TObject);
  147. begin
  148.     try
  149.        ButtonTimer.Interval:=minterval;          { update interval }
  150.        if xdir > 0 then xdir:=speed else xdir :=speed * -1;   { update speed }
  151.        if ydir > 0 then ydir:=speed else ydir :=speed * -1;
  152.        if buttonmoving then begin
  153.           if xdir > 0 then begin     { moving right }
  154.              if (left + width + xdir) <= parent.clientrect.right then
  155.                  left := left + xdir
  156.              else
  157.                  xdir:=xdir * -1;  { change sign if can't go right }
  158.           end
  159.           else  { moving left }
  160.              if (left + xdir) >= parent.clientrect.left then
  161.                  left:=left + xdir
  162.              else
  163.                 xdir:=xdir * -1;    { change sign if can't go left }
  164.           if ydir > 0 then begin     { moving down }
  165.              if (top + height + ydir) <= parent.clientrect.bottom then
  166.                  top := top + ydir
  167.              else
  168.                  ydir:=ydir * -1;     { change sign if can't go down }
  169.           end
  170.           else  { moving up }
  171.              if (top + ydir) >= parent.clientrect.top then
  172.                  top:=top + ydir
  173.              else
  174.                 ydir:=ydir * -1;     { change sign if can't go up }
  175.        end;
  176.     except
  177.        {The button has been destroyed!!!}
  178.        ButtonTimer.Enabled:=false;
  179.     end;
  180. end;
  181.  
  182. end.
  183.